package cn.antblog.collection;

import java.util.*;

/**
 * @author yangjy
 * @version 1.0
 * @description: Hashp探究
 * @date 2022/7/20 16:34
 */
public class HashMapTest {
    /*
     * hashCode()与 equals() 的相关规定：
     * 如果两个对象相等，则 hashcode 一定也是相同的
     * 两个对象相等,对两个 equals() 方法返回 true
     * 两个对象有相同的 hashcode 值，它们也不一定是相等的
     * 综上，equals() 方法被覆盖过，则 hashCode() 方法也必须被覆盖
     * hashCode()的默认行为是对堆上的对象产生独特值。如没果有重写 hashCode()，则该 class 的两个对象无论如何都不会相等（即使这两个对象指向相同的数据）。
     *
     * @param args
     */

    /**
     * @param args
     */
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        TreeMap<Object, Object> treeMap = new TreeMap<>();
        treeMap.put("1", "2");
        //HashSet 底层就是基于 HashMap 实现的。
        // （HashSet 的源码非常非常少，因为除了 clone()、writeObject()、readObject()是 HashSet 自己不得不实现之外，
        // 其他方法都是直接调用 HashMap 中的方法。
        HashSet<Object> hashSet = new HashSet<>();
        boolean add = hashSet.add(1);
        boolean add1 = hashSet.add(1);
        System.out.println("hashSet.toString() = " + hashSet.toString());

        //源码分析
        // hashMap 源码分析

        Map<Integer, String> map1 = new HashMap();
        map1.put(1, "Java");
        map1.put(2, "JDK");
        map1.put(3, "Spring Framework");
        map1.put(4, "MyBatis framework");
        map1.put(5, "Java中文社群");
        //HashMap 遍历从大的方向来说 7种遍历
//        1.使用迭代器（Iterator）EntrySet 的方式进行遍历；
//        2.使用迭代器（Iterator）KeySet 的方式进行遍历；
//        3.使用 For Each EntrySet 的方式进行遍历；
//        4.使用 For Each KeySet 的方式进行遍历；
//        5.使用 Lambda 表达式的方式进行遍历；
//        6.使用 Streams API 单线程的方式进行遍历；
//        7.使用 Streams API 多线程的方式进行遍历。
        //1.迭代器 EntrySet
        Iterator<Map.Entry<Integer, String>> iteratorEntrySet = map1.entrySet().iterator();
        while (iteratorEntrySet.hasNext()) {
            Map.Entry<Integer, String> entry = iteratorEntrySet.next();
            System.out.println("key = " + entry.getKey());
            System.out.println("val = " + entry.getValue());
        }
        //2.迭代器 KeySet
        Iterator<Integer> iteratorKeySet = map1.keySet().iterator();
        while (iteratorKeySet.hasNext()) {
            Integer key = iteratorKeySet.next();
            System.out.println(key);
            System.out.println(map.get(key));
        }
        //3.ForEach EntrySet
        for (Map.Entry<Integer, String> entry : map1.entrySet()) {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }
        //4.ForEach KeySet
        for (Integer key : map1.keySet()) {
            System.out.println(key);
            System.out.println(map.get(key));
        }
        //5.Lambda
        map1.forEach((key, val) -> {
            System.out.println(key);
            System.out.println(val);
        });
        //6.Streams API 单线程
        map1.entrySet().stream().forEach((entry) -> {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        });
        //7.Streams API 多线程
        map1.entrySet().parallelStream().forEach((entry) -> {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        });

    }
}
